/**
 * 
 */
package com.naiterui.ehp.bp.domain;

import static javax.persistence.GenerationType.IDENTITY;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import com.naiterui.ehp.bp.constants.CommonConstant;

/**
 * 患者钱包账户变动历史记录表
 * @author Amber
 * @since 1.0.0
 */
@Entity
@Table(name = "patient_account_history")
public class PatientAccountHistory implements Serializable {

    // ------------- 变动类型枚举 ------------- //
    /**
     * 变动类型-收入：<code>CHANGE_TYPE_INCOME</code>
     */
    public static final int CHANGE_TYPE_INCOME = 0;
    /**
     * 变动类型-支出：<code>CHANGE_TYPE_PAYOUT</code>
     */
    public static final int CHANGE_TYPE_PAYOUT = 1;

    // ------------- 变动类目枚举 -------------- //
    /**
     * 变动类目-仅主账户：<code>CHANGE_CATEGORY_MAIN</code>
     */
    public static final int CHANGE_CATEGORY_MAIN = 1;
    /**
     * 变动类目-仅副账户：<code>CHANGE_CATEGORY_SUB</code>
     */
    public static final int CHANGE_CATEGORY_SUB = 2;
    /**
     * 变动类目-主副混合：<code>CHANGE_CATEGORY_MIXD</code>
     */
    public static final int CHANGE_CATEGORY_MIXD = 3;

    // ------------- 收入原因枚举 --------------- //
    /**
     * 收入原因-充值：<code>INCOME_CAUSE_RECHARGE</code>
     */
    public static final int INCOME_CAUSE_RECHARGE = 1;
    /**
     * 收入原因-注册赠送：<code>INCOME_CAUSE_REGIST</code>
     */
    public static final int INCOME_CAUSE_REGIST = 2;
    /**
     * 收入原因-首次绑定手机号赠送：<code>INCOME_CAUSE_BIND_PHONE</code>
     */
    public static final int INCOME_CAUSE_BIND_PHONE = 3;
    /**
     * 收入原因-首次上传病例档案赠送：<code>INCOME_CAUSE_CASE_FILE</code>
     */
    public static final int INCOME_CAUSE_CASE_FILE = 4;
    /**
     * 收入原因-完成订单赠送：<code>INCOME_CAUSE_ORDER</code>
     */
    public static final int INCOME_CAUSE_ORDER = 5;
    /**
     * 收入原因-支付诊金赠送：<code>INCOME_CAUSE_PAY</code>
     */
    public static final int INCOME_CAUSE_PAY = 6;

    // --------------- 支出原因枚举 -------------- //
    /**
     * 支出原因-图文咨询：<code>PAYOUT_CAUSE_MESSAGE</code>
     */
    public static final int PAYOUT_CAUSE_MESSAGE = 1;
    /**
     * 支出原因-电话问诊：<code>PAYOUT_CAUSE_PHONE</code>
     */
    public static final int PAYOUT_CAUSE_PHONE = 2;

    private static final long serialVersionUID = -5438076565824693383L;

    /**
     * 主键：<code>id</code>
     */
    private Long id;
    /**
     * 账户id：<code>accountId</code>
     */
    private Long accountId;
    /**
     * 患者id：<code>patientId</code>
     */
    private Long patientId;
    /**
     * 变动金额：<code>changeAmount</code>
     */
    private Integer changeAmount;
    /**
     * 变动类型。0：收入，1：支出：<code>changeType</code>
     */
    private Integer changeType;
    /**
     * 变动前主账户余额：<code>preChgMaccBal</code>
     */
    private Integer preChgMaccBal;
    /**
     * 变动后主账户余额：<code>aftChgMaccBal</code>
     */
    private Integer aftChgMaccBal;
    /**
     * 变动前副账户余额：<code>preChgSaccBal</code>
     */
    private Integer preChgSaccBal;
    /**
     * 变动后副账户余额：<code>aftChgSaccBal</code>
     */
    private Integer aftChgSaccBal;
    /**
     * 变动前总余额：<code>preChgGaccBal</code>
     */
    private Integer preChgGaccBal;
    /**
     * 变动后总余额：<code>aftChgGaccBal</code>
     */
    private Integer aftChgGaccBal;
    /**
     * 变动类目。1：主账户；2：副账户；3：组合：<code>changeCategory</code>
     */
    private Integer changeCategory;
    /**
     * 收入原因。1：充值；2：注册赠送；3：完善个人资料赠送；4：首次上传病例赠送；5：下单赠送：<code>incomeCause</code>
     */
    private Integer incomeCause;
    /**
     * 支出原因。1：图文咨询；2：电话问诊：<code>payoutCause</code>
     */
    private Integer payoutCause;
    /**
     * 备注：<code>remark</code>
     */
    private String remark;
    /**
     * 状态：1：未提现：<code>status</code>
     */
    private Integer status;
    /**
     * 变动来源明细id：<code>changeOrigin</code>
     */
    private Long changeOrigin;
    /**
     * 创建时间：<code>createdAt</code>
     */
    private Date createdAt;
    /**
     * 创建人：<code>createdBy</code>
     */
    private String createdBy;

    /**
     * 修改时间：<code>changedAt</code>
     */
    private Date changedAt;
    /**
     * 修改人：<code>changedBy</code>
     */
    private String changedBy;

    public PatientAccountHistory() {
    }

    /**
     * 构造函数
     * @param acctountId 主账户id
     * @param ptientId 患者id
     * @param amount 变动金额
     * @param type 变动类型 0：收入；1：支出
     * @param accountId
     */
    public PatientAccountHistory(Long accountId, Long ptientId, int amount, int type) {
        this.accountId = accountId;
        this.patientId = ptientId;
        this.changeAmount = amount;
        this.changeType = type;
        this.createdAt = new Date();
        this.createdBy = "system";
        this.changedAt = new Date();
        this.changedBy = "system";
        this.incomeCause = 0;
        this.payoutCause = 0;
        this.status = CommonConstant.WDR_STATUS_NORMAL;

    }

    /**
     * @return Long 取得域 id 的方法。
     */
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    public Long getId() {
        return this.id;
    }

    /**
     * @param id 对域 id 的设置方法.
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * @return Long 取得域 accountId 的方法。
     */
    @Column(name = "account_id")
    public Long getAccountId() {
        return this.accountId;
    }

    /**
     * @param accountId 对域 accountId 的设置方法.
     */
    public void setAccountId(Long accountId) {
        this.accountId = accountId;
    }

    /**
     * @return Long 取得域 patientId 的方法。
     */
    @Column(name = "patient_id")
    public Long getPatientId() {
        return this.patientId;
    }

    /**
     * @param doctorId 对域 patientId 的设置方法.
     */
    public void setPatientId(Long patientId) {
        this.patientId = patientId;
    }

    /**
     * @return Integer 取得域 changeAmount 的方法。
     */
    @Column(name = "change_amount")
    public Integer getChangeAmount() {
        return this.changeAmount;
    }

    /**
     * @param changeAmount 对域 changeAmount 的设置方法.
     */
    public void setChangeAmount(Integer changeAmount) {
        this.changeAmount = changeAmount;
    }

    /**
     * @return Integer 取得域 changeType 的方法。
     */
    @Column(name = "change_type")
    public Integer getChangeType() {
        return this.changeType;
    }

    /**
     * @param changeType 对域 changeType 的设置方法.
     */
    public void setChangeType(Integer changeType) {
        this.changeType = changeType;
    }

    /**
     * @return Integer 取得域 preChgMaccBal 的方法。
     */
    @Column(name = "pre_chg_macc_bal")
    public Integer getPreChgMaccBal() {
        return this.preChgMaccBal;
    }

    /**
     * @param preChgMaccBal 对域 preChgMaccBal 的设置方法.
     */
    public void setPreChgMaccBal(Integer preChgMaccBal) {
        this.preChgMaccBal = preChgMaccBal;
    }

    /**
     * @return Integer 取得域 aftChgMaccBal 的方法。
     */
    @Column(name = "aft_chg_macc_bal")
    public Integer getAftChgMaccBal() {
        return this.aftChgMaccBal;
    }

    /**
     * @param aftChgMaccBal 对域 aftChgMaccBal 的设置方法.
     */
    public void setAftChgMaccBal(Integer aftChgMaccBal) {
        this.aftChgMaccBal = aftChgMaccBal;
    }

    /**
     * @return Integer 取得域 preChgSaccBal 的方法。
     */
    @Column(name = "pre_chg_sacc_bal")
    public Integer getPreChgSaccBal() {
        return this.preChgSaccBal;
    }

    /**
     * @param preChgSaccBal 对域 preChgSaccBal 的设置方法.
     */
    public void setPreChgSaccBal(Integer preChgSaccBal) {
        this.preChgSaccBal = preChgSaccBal;
    }

    /**
     * @return Integer 取得域 aftChgSaccBal 的方法。
     */
    @Column(name = "aft_chg_sacc_bal")
    public Integer getAftChgSaccBal() {
        return this.aftChgSaccBal;
    }

    /**
     * @param aftChgSaccBal 对域 aftChgSaccBal 的设置方法.
     */
    public void setAftChgSaccBal(Integer aftChgSaccBal) {
        this.aftChgSaccBal = aftChgSaccBal;
    }

    /**
     * @return Integer 取得域 preChgGaccBal 的方法。
     */
    @Column(name = "pre_chg_gacc_bal")
    public Integer getPreChgGaccBal() {
        return this.preChgGaccBal;
    }

    /**
     * @param preChgGaccBal 对域 preChgGaccBal 的设置方法.
     */
    public void setPreChgGaccBal(Integer preChgGaccBal) {
        this.preChgGaccBal = preChgGaccBal;
    }

    /**
     * @return Integer 取得域 aftChgGaccBal 的方法。
     */
    @Column(name = "aft_chg_gacc_bal")
    public Integer getAftChgGaccBal() {
        return this.aftChgGaccBal;
    }

    /**
     * @param aftChgGaccBal 对域 aftChgGaccBal 的设置方法.
     */
    public void setAftChgGaccBal(Integer aftChgGaccBal) {
        this.aftChgGaccBal = aftChgGaccBal;
    }

    /**
     * @return Integer 取得域 changeCategory 的方法。
     */
    @Column(name = "change_category")
    public Integer getChangeCategory() {
        return this.changeCategory;
    }

    /**
     * @param changeCategory 对域 changeCategory 的设置方法.
     */
    public void setChangeCategory(Integer changeCategory) {
        this.changeCategory = changeCategory;
    }

    /**
     * @return Integer 取得域 incomeCause 的方法。
     */
    @Column(name = "income_cause")
    public Integer getIncomeCause() {
        return this.incomeCause;
    }

    /**
     * @param incomeCause 对域 incomeCause 的设置方法.
     */
    public void setIncomeCause(Integer incomeCause) {
        this.incomeCause = incomeCause;
    }

    /**
     * @return Integer 取得域 payoutCause 的方法。
     */
    @Column(name = "payout_cause")
    public Integer getPayoutCause() {
        return this.payoutCause;
    }

    /**
     * @param payoutCause 对域 payoutCause 的设置方法.
     */
    public void setPayoutCause(Integer payoutCause) {
        this.payoutCause = payoutCause;
    }

    /**
     * @return Long 取得域 changeOrigin 的方法。
     */
    @Column(name = "change_origin")
    public Long getChangeOrigin() {
        return this.changeOrigin;
    }

    /**
     * @param changeOrigin 对域 changeOrigin 的设置方法.
     */
    public void setChangeOrigin(Long changeOrigin) {
        this.changeOrigin = changeOrigin;
    }

    /**
     * @return String 取得域 remark 的方法。
     */
    @Column(name = "remark")
    public String getRemark() {
        return this.remark;
    }

    /**
     * @param remark 对域 remark 的设置方法.
     */
    public void setRemark(String remark) {
        this.remark = remark;
    }

    /**
     * @return Integer 取得域 status 的方法。
     */
    @Column(name = "status")
    public Integer getStatus() {
        return this.status;
    }

    /**
     * @param status 对域 status 的设置方法.
     */
    public void setStatus(Integer status) {
        this.status = status;
    }

    /**
     * @return Date 取得域 createdAt 的方法。
     */
    @Column(name = "created_at")
    public Date getCreatedAt() {
        return this.createdAt;
    }

    /**
     * @param createdAt 对域 createdAt 的设置方法.
     */
    public void setCreatedAt(Date createdAt) {
        this.createdAt = createdAt;
    }

    /**
     * @return String 取得域 createdBy 的方法。
     */
    @Column(name = "created_by")
    public String getCreatedBy() {
        return this.createdBy;
    }

    /**
     * @param createdBy 对域 createdBy 的设置方法.
     */
    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    /**
     * @return Date 取得域 changedAt 的方法。
     */
    @Column(name = "changed_at")
    public Date getChangedAt() {
        return this.changedAt;
    }

    /**
     * @param changedAt 对域 changedAt 的设置方法.
     */
    public void setChangedAt(Date changedAt) {
        this.changedAt = changedAt;
    }

    /**
     * @return String 取得域 changedBy 的方法。
     */
    @Column(name = "changed_by")
    public String getChangedBy() {
        return this.changedBy;
    }

    /**
     * @param changedBy 对域 changedBy 的设置方法.
     */
    public void setChangedBy(String changedBy) {
        this.changedBy = changedBy;
    }

}
